package threading;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2023-07-03
 * Time: 22:49
 */

//编译器优化导致出错
public class ThreadDemo14 {
    //public static int flag = 0;
    volatile public static int flag = 0;//加volatile关键字，就可以使编译器不再优化，每次都重新读取内存（load）
    //volatile不保证原子性，使用场景，一个写，一个读
    // 保证内存可见性，即一个线程修改，另一个知道
    // 禁止指令重排序，即顺序不可以变，1.load，2.cmp，必须按照顺序执行
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            while (flag == 0) {
                //1. load,开销是cmp的几千倍
                //2. cmp，很快
                //load之前，已经cmp了很多次，编译器就认为每次load的值都相同，所以直接将load优化掉了
                //就导致结果出错
                //一般单线程都是正确的，多线程会出错
            }
            System.out.println("循环结束，t1结束");
        });
        Thread t2 = new Thread(() -> {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入一个整数：");
            flag = scanner.nextInt();
        });

        t1.start();
        t2.start();

    }
}
